Xceed DataGrid for WPF v7.3 Documentation
In This Topic
    Sorting and displaying on different values
    In This Topic

    The following example demonstrates how to define foreign-key descriptions that sort on certain values but display these values differently, via a ForeignKeyConverter.  For instance, Employees will sort on last name then first name, but cells will display a photo, first name, and then last name.

    XAML
    Copy Code
    <Grid xmlns:xcdg="http://schemas.xceed.com/wpf/xaml/datagrid">
     <Grid.Resources>
        <local:EmployeeForeignKeyConverter x:Key="employeeForeignKeyConverter" />
     
        <xcdg:DataGridCollectionViewSource x:Key="cvs_orders"
                                           Source="{Binding Source={x:Static Application.Current}, Path=Orders}">
                <xcdg:DataGridCollectionViewSource.ItemProperties>
                   <xcdg:DataGridItemProperty Name="EmployeeID">
                      <xcdg:DataGridItemProperty.ForeignKeyDescription>
                         <xcdg:DataTableForeignKeyDescription ItemsSource="{Binding Source={x:Static Application.Current}, Path=Employees}"
                                                              ValuePath="EmployeeID"
                                                              ForeignKeyConverter="{StaticResource employeeForeignKeyConverter}" />
                      </xcdg:DataGridItemProperty.ForeignKeyDescription>
                   </xcdg:DataGridItemProperty>
                </xcdg:DataGridCollectionViewSource.ItemProperties>
             </xcdg:DataGridCollectionViewSource>
     </Grid.Resources>      
     
     <xcdg:DataGridControl x:Name="OrdersGrid"
                           ItemsSource="{Binding Source={StaticResource cvs_orders}}"
                           AutoCreateForeignKeyConfigurations="True">
        <xcdg:DataGridControl.Columns>
                <xcdg:Column FieldName="EmployeeID"
                             Title="Employee"
                             Width="160">
                   <xcdg:Column.CellContentTemplate>
                      <DataTemplate>
                         <DockPanel>
                            <Image Source="{Binding SmallPhoto}"
                                   Height="20"
                                   VerticalAlignment="Top"
                                   Margin="1"
                                   DockPanel.Dock="Left" />
                            <StackPanel Orientation="Horizontal">
                               <TextBlock Text="{Binding FirstName}" />
                               <TextBlock Text=" " />
                               <TextBlock Text="{Binding LastName}" />
                            </StackPanel>
                         </DockPanel>
                      </DataTemplate>
                   </xcdg:Column.CellContentTemplate>
                </xcdg:Column>
        </xcdg:DataGridControl.Columns>
     </xcdg:DataGridControl>
    </Grid> 

     The following code provides the implementation of the EmployeeForeignKeyConverter class.

    VB.NET
    Copy Code
    Public Class EmployeeForeignKeyConverter
      Inherits DataTableForeignKeyConverter
      'Only the GetValueFormKey method overload with the DataGridForeignKeyDescription parameter needs to be overridden,
      'for the base class DataTableForeignKeyConverter already provides an implementation of the other two overridable methods.
      Public Overrides Function GetValueFromKey(ByVal key As Object, ByVal description As DataGridForeignKeyDescription) As Object
        If key Is Nothing Then
          Return Nothing
        End If
    
        Dim dataView As DataView = TryCast(description.ItemsSource, DataView)
        If dataView IsNot Nothing Then
          dataView.Sort = description.ValuePath
    
          Dim index As Integer = dataView.Find(key)
          Dim dataRow As DataRowView = dataView(index)
    
          'Return a value built in this order, so sorting is done on last name, then first name.
          Return dataRow("LastName") & ", " & dataRow("FirstName")
        End If
    
        Return key
      End Function
    End Class 
    C#
    Copy Code
    public class EmployeeForeignKeyConverter : DataTableForeignKeyConverter
      {
        //Only the GetValueFormKey method overload with the DataGridForeignKeyDescription parameter needs to be overridden,
        //for the base class DataTableForeignKeyConverter already provides an implementation of the other two overridable methods.
        public override object GetValueFromKey( object key, DataGridForeignKeyDescription description )
        {
          if( key == null )
            return null;
    
          var dataView = description.ItemsSource as DataView;
          if( dataView != null )
          {
            dataView.Sort = description.ValuePath;
    
            var index = dataView.Find( key );
            var dataRow = dataView[ index ];
    
            //Return a value built in this order, so sorting is done on last name, then first name.
            return dataRow[ "LastName" ] + ", " + dataRow[ "FirstName" ];
          }
    
          return key;
        }
      }